package hr.ctg.domain.action;

import hr.ctg.domain.model.DojamPosjetitelja;
import hr.ctg.domain.model.Korisnik;
import hr.ctg.domain.model.Mjesto;
import hr.ctg.domain.model.Objekt;
import hr.ctg.domain.model.Otok;
import hr.ctg.domain.model.Park;
import hr.ctg.service.dao.DojamPosjetiteljaDAO;
import hr.ctg.service.dao.MjestoDAO;
import hr.ctg.service.dao.ObjektDAO;
import hr.ctg.service.dao.OtokDAO;
import hr.ctg.service.dao.ParkDAO;
import hr.ctg.util.CacheUtil;

import java.text.MessageFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.faces.context.FacesContext;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.log.Log;

@Scope(ScopeType.CONVERSATION)
@Name("dojamAction")
public class DojamAction {

	@In
	ObjektDAO objektDAO;
	@In
	MjestoDAO mjestoDAO;
	@In
	OtokDAO otokDAO;
	@In
	ParkDAO parkDAO;
	@In
	Map<String, String> messages;
	@In
	FacesContext facesContext;
	@In
	DojamPosjetiteljaDAO dojamPosjetiteljaDAO;
	@In(required = false)
	Korisnik korisnik;
	@In
	String currentLang;

	@DataModel
	List<DojamPosjetitelja> dojmovi;

	@DataModelSelection
	@In(required = false)
	@Out(required = false)
	private DojamPosjetitelja dojamPosjetitelja;

	@Out(required = false)
	private Objekt dojamObjekt;
	@Out(required = false)
	private Mjesto dojamMjesto;
	@Out(required = false)
	private Otok dojamOtok;
	@Out(required = false)
	Park dojamPark;

	@Logger
	Log log;

	@RequestParameter
	Integer idObjekta;
	@RequestParameter
	Integer idMjesta;
	@RequestParameter
	Integer idOtoka;
	@RequestParameter
	Integer idParka;

	@Out(required = false)
	String message;

	private String back;

	@Begin(join = true)
	@Restrict("#{identity.loggedIn}")
	public String addSetup(final String back) {
		this.back = back;

		if (idObjekta != null) {
			dojamObjekt = objektDAO.find(idObjekta);

			dojamPosjetitelja = dojamPosjetiteljaDAO
					.findByIdObjektaIdKorisnika(idObjekta, korisnik
							.getIdKorisnika());

		} else if (idMjesta != null) {
			dojamMjesto = mjestoDAO.find(idMjesta);
			dojamPosjetitelja = dojamPosjetiteljaDAO.findByIdMjestaIdKorisnika(
					idMjesta, korisnik.getIdKorisnika());
		} else if (idParka != null) {
			dojamPark = parkDAO.find(idParka);
			dojamPosjetitelja = dojamPosjetiteljaDAO.findByIdParkaIdKorisnika(
					idParka, korisnik.getIdKorisnika());
		} else {
			dojamOtok = otokDAO.find(idOtoka);
			dojamPosjetitelja = dojamPosjetiteljaDAO.findByIdOtokaIdKorisnika(
					idOtoka, korisnik.getIdKorisnika());
		}

		return "addDojam";
	}

	@Begin(join = true)
	public String editSetup(final String back) {
		this.back = back;
		dojamPosjetitelja = dojamPosjetiteljaDAO.merge(dojamPosjetitelja);
		if (dojamPosjetitelja.getObjekt() != null) {
			dojamObjekt = objektDAO.find(dojamPosjetitelja.getObjekt()
					.getIdObjekta());

		} else if (dojamPosjetitelja.getMjesto() != null) {
			dojamMjesto = mjestoDAO.find(idMjesta);
		} else if (dojamPosjetitelja.getPark() != null) {
			dojamPark = parkDAO.find(dojamPosjetitelja.getPark().getIdParka());
		} else if (dojamPosjetitelja.getOtok() != null) {
			dojamOtok = otokDAO.find(dojamPosjetitelja.getOtok().getIdOtoka());
		}

		return "editDojam";
	}

	@End()
	@Transactional
	public String edit() {
		dojamPosjetiteljaDAO.merge(dojamPosjetitelja);
		return back;
	}

	@End(beforeRedirect = true)
	public String delete() {
		dojamPosjetitelja = dojamPosjetiteljaDAO.merge(dojamPosjetitelja);
		dojamPosjetiteljaDAO.remove(dojamPosjetitelja);

		return back;
	}

	@Factory("dojmovi")
	public void getDojmovi() {
		if (idObjekta != null) {
			dojmovi = dojamPosjetiteljaDAO.findByIdObjekta(idObjekta);
		} else if (idMjesta != null) {
			dojmovi = dojamPosjetiteljaDAO.findByIdMjesta(idMjesta);
		} else if (idOtoka != null) {
			dojmovi = dojamPosjetiteljaDAO.findByIdOtoka(idOtoka);
		} else if (idParka != null) {
			dojmovi = dojamPosjetiteljaDAO.findByIdParka(idParka);
		} else {

		}
	}

	@End
	public String back() {
		return back;
	}

	@Transactional
	@End(beforeRedirect = true)
	@Restrict("#{identity.loggedIn}")
	public String add() {
		dojamPosjetitelja.setDatum(new Date());
		if (dojamPosjetitelja.getIdDpp() == null) {
			dojamPosjetitelja.setKorisnik(korisnik);
			if (dojamObjekt != null) {
				dojamPosjetitelja.setObjekt(dojamObjekt);
			} else if (dojamMjesto != null) {
				dojamPosjetitelja.setMjesto(dojamMjesto);
			} else if (dojamPark != null) {
				dojamPosjetitelja.setPark(dojamPark);
			} else {
				dojamPosjetitelja.setOtok(dojamOtok);
			}
		}

		if (dojamObjekt != null) {
			CacheUtil.clearCache(dojamObjekt, currentLang);

		}
		if (dojamMjesto != null) {
			CacheUtil.clearCache(dojamMjesto, currentLang);

		}
		if (dojamOtok != null) {
			CacheUtil.clearCache(dojamOtok, currentLang);

		}
		if (dojamPark != null) {
			CacheUtil.clearCache(dojamPark, currentLang);

		}

		dojamPosjetiteljaDAO.merge(dojamPosjetitelja);

		message = MessageFormat.format(messages.get("message.rating"),
				new Object[] { Short.valueOf(dojamPosjetitelja.getOcjena()) });

		return back;
	}
}